#include<iostream>
#include<vector>
using namespace std;
vector<int>arr;
int n, k, l;
bool check(int mid) {//mid相当于每次从中间取一个数，check是新定义的函数名
	int need = 0;		
	for (int i = 0; i < n - 1; i++) {
		int dist = arr[i + 1] - arr[i];//算每次零食的间隔
		if (dist > mid) {
			need += (dist + mid - 1) / mid - 1;//物品数=间隔数-1；
			if (need > k)return false;
		}
	}
	return need <= k;
	
}
int main() {
	/*艾伦是一个强迫症患者，在他看来，桌子上的相邻物品摆放的最大的距离越小他就越开心。
	现在他刚上大学，发现桌子上已经摆放了n个室友给他的零食，而他的包里还有k件物品，
	他要将这些物品全部摆放到桌子上，我们把最后桌子上相邻物品摆放的最大的距离叫做艾伦的心情值，
	请问艾伦的心情值最小是多少?(桌子的最左端定义为0，最右端定义为l，保证左右两端的零食一定给出)
	，所有物品和零食可以堆叠放置。（将桌子看作一条线，物品与零食是线上的点）
输入
第一行输入三个整数n,k,l(2<= n, k <= 105, 1 <= l <= 109)，分别表示桌子上已经有的室友的零食的个数
，艾伦包里的物品个数，桌子的宽度。
第二行输入n个整数a1,a2..,an(1≤ ai ≤ l,  ∀ai ∈ [1,n],  ai < ai + 1)，表示桌子上每个物品的位置

输出
艾伦的心情值的最小值。
样例输入 Copy
2 1 101
0 101
样例输出 Copy
51*/
	ios::sync_with_stdio(false);//加速输入；
	cin.tie(nullptr);
	cin >> n >> k >> l;
	arr.resize(n);//调整数组容量为n；可以代替push_back;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	int left = 1;
	int right = l;
	int ans = 1;
	while (left <= right) {
		int mid = left + (right - left)/2;
		if (check(mid)) {
			ans = mid;
			
			right = mid-1;//向左半部分检索
		}
		else {
			left = mid + 1;//向右半部份检索
		}
	}
	cout << ans<<"\n";
}//二分思想往往用于求最优解，最小化最大值类，直接求解困难类；